package com.geline.mybatisplus.service;

import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.geline.mybatisplus.domain.PageQuery;
import com.geline.mybatisplus.util.QueryWrapperUtil;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

@Deprecated
public interface IServices<T> {

    <V> boolean save(V object);

    <V> boolean updateById(V object);

    boolean saveBatch(Collection<T> entityList);

    boolean removeById(Serializable id);

    boolean removeByIds(Collection<?> ids);

    T getById(Serializable id);

    <V> V getById(Serializable id, Class<V> voClass);

    default List<T> list(Object queryModel){
        QueryWrapper<T> wrapper = QueryWrapperUtil.build(queryModel);
        return list(wrapper);
    }

    List<T> list(AbstractWrapper<T, ?, ?> queryWrapper);

    default <V> List<V> list(Object queryModel, Class<V> voClass){
        QueryWrapper<T> wrapper = QueryWrapperUtil.build(queryModel);
        return list(wrapper, voClass);
    }

    <V> List<V> list(AbstractWrapper<T, ?, ?> queryWrapper, Class<V> voClass);

    default List<Map<String, Object>> listMaps(Object queryModel){
        QueryWrapper<T> wrapper = QueryWrapperUtil.build(queryModel);
        return listMaps(wrapper);
    }

    List<Map<String, Object>> listMaps(AbstractWrapper<T, ?, ?> queryWrapper);

    default <V> List<V> listMaps(Object queryModel, Class<V> voClass){
        QueryWrapper<T> wrapper = QueryWrapperUtil.build(queryModel);
        return listMaps(wrapper, voClass);
    }

    <V> List<V> listMaps(AbstractWrapper<T, ?, ?> queryWrapper, Class<V> voClass);

    default IPage<T> page(PageQuery pageQuery, Object queryModel){
        QueryWrapper<T> wrapper = QueryWrapperUtil.build(queryModel, pageQuery);
        return page(pageQuery.build(), wrapper);
    }

    IPage<T> page(IPage page, AbstractWrapper<T, ?, ?> queryWrapper);

    default <V> IPage<V> page(PageQuery pageQuery, Object queryModel, Class<V> voClass){
        QueryWrapper<T> wrapper = QueryWrapperUtil.build(queryModel, pageQuery);
        return page(pageQuery.build(), wrapper, voClass);
    }

    <V> IPage<V> page(IPage page, AbstractWrapper<T, ?, ?> queryWrapper, Class<V> voClass);

    default IPage<Map<String, Object>> pageMaps(PageQuery pageQuery, Object queryModel){
        QueryWrapper<T> wrapper = QueryWrapperUtil.build(queryModel, pageQuery);
        return pageMaps(pageQuery.build(), wrapper);
    }

    IPage<Map<String, Object>> pageMaps(IPage page, AbstractWrapper<T, ?, ?> queryWrapper);

    default <V> IPage<V> pageMaps(PageQuery pageQuery, Object queryModel, Class<V> voClass){
        QueryWrapper<T> wrapper = QueryWrapperUtil.build(queryModel, pageQuery);
        return pageMaps(pageQuery.build(), wrapper, voClass);
    }

    <V> IPage<V> pageMaps(IPage page, AbstractWrapper<T, ?, ?> queryWrapper, Class<V> voClass);
}
